/*
Language: C#
Author: Jason Diamond <jason@diamond.name>
*/

function(hljs) {
  return {
    defaultMode: {
      keywords:
        // Normal keywords.
        'abstract as base bool break byte case catch char checked class const continue decimal ' +
        'default delegate do double else enum event explicit extern false finally fixed float ' +
        'for foreach goto if implicit in int interface internal is lock long namespace new null ' +
        'object operator out override params private protected public readonly ref return sbyte ' +
        'sealed short sizeof stackalloc static string struct switch this throw true try typeof ' +
        'uint ulong unchecked unsafe ushort using virtual volatile void while ' +
        // Contextual keywords.
        'ascending descending from get group into join let orderby partial select set value var '+
        'where yield',
      contains: [
        {
          className: 'comment',
          begin: '///', end: '$', returnBegin: true,
          contains: [
            {
              className: 'xmlDocTag',
              begin: '///|<!--|-->'
            },
            {
              className: 'xmlDocTag',
              begin: '</?', end: '>'
            }
          ]
        },
        hljs.C_LINE_COMMENT_MODE,
        hljs.C_BLOCK_COMMENT_MODE,
        {
          className: 'preprocessor',
          begin: '#', end: '$',
          keywords: 'if else elif endif define undef warning error line region endregion pragma checksum'
        },
        {
          className: 'string',
          begin: '@"', end: '"',
          contains: [{begin: '""'}]
        },
        hljs.APOS_STRING_MODE,
        hljs.QUOTE_STRING_MODE,
        hljs.C_NUMBER_MODE
      ]
    }
  };
}
